[アップデート] Amazon Aurora PostgreSQL 16.4 がリリースされたので、Babelfish 4.3 のパーティション機能を確認してみた
いわさです。
先日 Aurora PostgreSQL の 16.4 がリリースされました!
これに併せて、Babelfish も 4.3.0 がリリースされています。
Babelfish とは Aurora PostgreSQL の機能で、Aurora が Microsoft SQL Server 用に作成されたアプリケーションからのコマンドを理解出来るようにさせる機能です。
Microsoft SQL Server の全機能に互換性があるわけではないのですが、Babelfish がアップデートされる度に互換性が向上しています。
今回も最新機能を確認して使ってみたいと思います。
バージョン確認
まずはお約束のバージョン確認からです。
前回の 4.2.0 は以下でして、同じ手順で確認します。
マネジメントコンソールで Aurora PostgreSQL の最新バージョンを構築します。
構築時に Babelfish 有効化オプションを ON にします。
クラスターの準備が出来たら、まずは psql で接続してみます。拡張機能のバージョンから確認しましょう。
% psql -h hoge1001babelfish.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d babelfish_db
Password for user postgres:
psql (14.11 (Homebrew), server 16.4)
WARNING: psql major version 14, server major version 16.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
SELECT aurora_version() AS aurora_version, version() AS postgresql_version, sys.version() AS Babelfish_compatibility, sys.SERVERPROPERTY('BabelfishVersion') AS Babelfish_Version;
aurora_version | postgresql_version | babelfish_compatibility | babelfish_version
----------------+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------
16.4.0 | PostgreSQL 16.4 on x86_64-pc-linux-gnu, compiled by x86_64-pc-linux-gnu-gcc (GCC) 9.5.0, 64-bit | Babelfish for Aurora PostgreSQL with SQL Server Compatibility - 12.0.2000.8+| 4.3.0
| | Sep 16 2024 00:16:18 +|
| | Copyright (c) Amazon Web Services +|
| | PostgreSQL 16.4 on x86_64-pc-linux-gnu (Babelfish 4.3.0) |
(1 row)
よしよし。Babelfish バージョンが 4.3.0 であることが確認出来ますね。
新機能を試す
続いて新機能を確認してみましょう。
Amazon Aurora の次のドキュメントから Babelfish のアップデート内容を確認することが出来ます。
今回 4.3.0 の目玉はパーティションの機能が一部使えるようになった点でしょうか。
パーティション機能
Babelfish の一部機能は個別のドキュメントが作成されており、パーティションに関するページも以下の個別ページが用意されていました。
CREATE PARTITION FUNCTION や CREATE PARTITION SCHEME が使えるようになり、CREATE TABLE や CREATE INDEX の ON 句で指定出来るようになっています。
あとは$PARTITION
関数なども提供されています。
本日時点では結構制限事項も多いのですが、次のドキュメントに記載されています。後で LEFT オプションなどの制限は動作確認してみましょう。
まずは sqlcmd で Aurora に接続し、データベースを作成します。
% sqlcmd -S hoge1001babelfish.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres
Password:
1> create database hogedb;
2> go
1> use hogedb;
2> go
Changed database context to 'hogedb'.
作成出来ました。ここからがアップデートで実現出来るようになった機能ですが、パーティション設定を行っていきます。
まずはパーティション関数を作成します。
1> CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (1, 100, 1000);
2> go
Msg 33557097, Level 16, State 1, Server hoge1001babelfish-instance-1, Line 1
'PARTIION FUNCTION with LEFT option' is not currently supported in Babelfish
エラーとなりました。前述の公式ドキュメントに記載のとおり LEFT オプションは本日時点でサポートされていません。
以下のように記載されています。きっとそのうちサポートされます。
The LEFT boundary option for partition functions isn't yet supported.
ということで、今回は RIGHT オプションでいきます。
1> CREATE PARTITION FUNCTION myRangePF2 (int) AS RANGE RIGHT FOR VALUES (1, 100, 1000);
2> go
続いてパーティションのファイルグループマップ構成を作成します。
1> CREATE PARTITION SCHEME myRangePS2 AS PARTITION myRangePF2 TO (test1fg, test2fg, test3fg, test4fg);
2> go
問題なく作成出来ました。
最後に、今回はテーブルに設定を行います。
1> CREATE TABLE myRangeTbl (col1 int PRIMARY KEY, col2 char(10)) ON myRangePS2 (col1);
2> go
パーティションを意識してサンプルデータをいくつか作成します。
1> insert into myRangeTbl values (0, 'aaa');
2> insert into myRangeTbl values (1, 'bbb');
3> insert into myRangeTbl values (2, 'ccc');
4> insert into myRangeTbl values (100, 'ddd');
5> insert into myRangeTbl values (1000, 'ddd');
6> go
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
今回は実行計画からパーティションスキャン状況を確認します。
1> SET BABELFISH_SHOWPLAN_ALL ON;
2> go
1> select * from myRangeTbl;
2> go
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl
Append (cost=0.00..116.20 rows=5080 width=36)
-> Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_1 myrangetbl_1 (cost=0.00..22.70 rows=1270 width=36)
-> Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_2 myrangetbl_2 (cost=0.00..22.70 rows=1270 width=36)
-> Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_3 myrangetbl_3 (cost=0.00..22.70 rows=1270 width=36)
-> Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_0 myrangetbl_4 (cost=0.00..22.70 rows=1270 width=36)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 0.218 ms
あー、いいですね。良さそうでは?
条件指定してもう少し見てみましょう。
1> select * from myRangeTbl where col1 > 100;
2> go
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl where col1 > 100
Append (cost=7.43..49.67 rows=846 width=36)
-> Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_2 myrangetbl_1 (cost=7.43..22.72 rows=423 width=36)
Recheck Cond: (col1 > 100)
-> Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_2_pkey (cost=0.00..7.32 rows=423 width=0)
Index Cond: (col1 > 100)
-> Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_3 myrangetbl_2 (cost=7.43..22.72 rows=423 width=36)
Recheck Cond: (col1 > 100)
-> Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_3_pkey (cost=0.00..7.32 rows=423 width=0)
Index Cond: (col1 > 100)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 318.822 ms
1> select * from myRangeTbl where col1 < 100;
2> go
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl where col1 < 100
Append (cost=7.43..49.67 rows=846 width=36)
-> Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_1 myrangetbl_1 (cost=7.43..22.72 rows=423 width=36)
Recheck Cond: (col1 < 100)
-> Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_1_pkey (cost=0.00..7.32 rows=423 width=0)
Index Cond: (col1 < 100)
-> Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_0 myrangetbl_2 (cost=7.43..22.72 rows=423 width=36)
Recheck Cond: (col1 < 100)
-> Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_0_pkey (cost=0.00..7.32 rows=423 width=0)
Index Cond: (col1 < 100)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 11.696 ms
いいですね。パーティションの範囲に従ってスキャン出来てそうです。
さいごに
本日は Amazon Aurora PostgreSQL 16.4 がリリースされたので、Babelfish 4.3 のパーティション機能を確認してみました。
まだ制限事項が多いですが、また SQL Server の機能が開放されましたね。継続的にアップデートがされており良い感じです。
今後も Babelfish の動向をチェックしていきたいと思います。